using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;

namespace Idp_Login.Configs.Id4
{
    public static class Id4Credential
    {
        public static IIdentityServerBuilder AddCredential(this IIdentityServerBuilder id4Builder, IWebHostEnvironment environment, Certificate certificate)
        {
            //证书的创建
            //https://www.cnblogs.com/fengchao1000/p/10254903.html
            //https://www.cnblogs.com/php-no-2/p/11276323.html

            //id4Builder.AddSigningCredential(new X509Certificate2("IS4.pfx", "123456"));
            //return id4Builder;

            if (certificate == null || string.IsNullOrEmpty(certificate.Path))
            {
                Console.WriteLine("加载开发人员证书");
                id4Builder.AddDeveloperSigningCredential();
                return id4Builder;
            }
            else
            {
                var certificateFullPath = Idp_Login.PathHelper.PathCombine('/', environment.ContentRootPath, certificate.Path);
                Console.WriteLine($"指定的证书路径为:{certificateFullPath}");

                if (File.Exists(certificateFullPath))
                {
                    Console.WriteLine("加载指定证书");
                    try
                    {
                        var certificates = new X509Certificate2(certificate.Path, certificate.Password);
                        id4Builder.AddSigningCredential(certificates);
                    }
                    catch (Exception e)
                    {
                        throw new Exception("添加密钥文件时出错-在创建签名密钥期间", e);
                    }
                }
                else
                {
                    Console.WriteLine($"指定的证书路径不存在,加载开发人员证书");

                    // （RSA 证书加密）  临时使用的  设置临时签名凭证。   默认使用 tempkey.rsa
                    //这个证书不能用于集群环境(一旦集群就会登录失败,如果只开一台, nginx反向代理 则登录正常.)
                    //当您没有证书可供使用时，这仅适用于开发人员。
                    //解决场景:  每次重启项目的时候，都会重新生成一个新的证书，这时候就会导致一个问题，重启之前生成的access_token，在重启之后，就不适用了，
                    id4Builder.AddDeveloperSigningCredential();
                }

                return id4Builder;
            }
        }
    }
}
